package vip.liux.backend.application.service.pay;

import vip.liux.application.dots.PagedResultDto;
import vip.liux.backend.application.service.pay.dto.wallet.PayWalletDto;
import vip.liux.backend.application.service.pay.dto.wallet.PayWalletQueryDto;
import vip.liux.backend.application.service.pay.dto.wallet.PayWalletTransactionDto;
import vip.liux.contracts.shared.enums.pay.PayWalletBizType;

import java.math.BigDecimal;

/**
 * 钱包 Service 接口
 *
 * @author jason
 */
public interface PayWalletService {

    /**
     * 获取钱包信息
     * <p>
     * 如果不存在，则创建钱包。由于用户注册时候不会创建钱包
     *
     * @param uid 用户编号
     */
    PayWalletDto getOrCreateWallet(String uid);

    /**
     * 获取钱包信息
     *
     * @param walletId 钱包 id
     */
    PayWalletDto getWallet(Long walletId);

    /**
     * 获得会员钱包分页
     *
     * @param input 分页查询
     * @return 会员钱包分页
     */
    PagedResultDto<PayWalletDto> getWalletPage(PayWalletQueryDto input);

    /**
     * 钱包订单支付
     *
     * @param walletId   钱包编号
     * @param outTradeNo 外部订单号
     * @param price      金额
     */
    PayWalletTransactionDto orderPay(Long walletId, String outTradeNo, BigDecimal price);

    /**
     * 钱包订单支付退款
     *
     * @param outRefundNo 外部退款号
     * @param refundPrice 退款金额
     * @param reason      退款原因
     */
    PayWalletTransactionDto orderRefund(String outRefundNo, BigDecimal refundPrice, String reason);

    /**
     * 扣减钱包余额
     *
     * @param walletId 钱包编号
     * @param bizId    业务关联编号
     * @param bizType  业务关联分类
     * @param price    扣减金额
     * @return 钱包流水
     */
    PayWalletTransactionDto reduceWalletBalance(Long walletId, Long bizId,
                                                PayWalletBizType bizType, BigDecimal price);

    /**
     * 增加钱包余额
     *
     * @param walletId 钱包编号
     * @param bizId    业务关联编号
     * @param bizType  业务关联分类
     * @param price    增加金额
     * @return 钱包流水
     */
    PayWalletTransactionDto addWalletBalance(Long walletId, String bizId,
                                             PayWalletBizType bizType, BigDecimal price);

    /**
     * 冻结钱包部分余额
     *
     * @param id    钱包编号
     * @param price 冻结金额
     */
    void freezePrice(Long id, BigDecimal price);

    /**
     * 解冻钱包余额
     *
     * @param id    钱包编号
     * @param price 解冻金额
     */
    void unfreezePrice(Long id, BigDecimal price);

}
